package leetcode.editor.cn.dsa07_doublepointer;
// 给定一个排序数组，你需要在 原地 删除重复出现的元素，
// 使得每个元素只出现一次，返回移除后数组的新长度

public class RemoveDuplicatesFromSortedArray26_1 {
    public static void main(String[] args) {
        Solution solution = new RemoveDuplicatesFromSortedArray26_1().new Solution();
        //int[] arr = {1,1,2};
        int[] arr = {0,0,1,1,1,2,2,3,3,4};
        //int[] arr = {1,2,3};
        System.out.println("长度：" + solution.removeDuplicates(arr));
        for (int num : arr) {
            System.out.print(num + ",");
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 最优解：双指针解法
         * 1.定义两个指针（索引）分别指向目标位和待移动元素位
         *   初始目标位为0，待移动元素位为1
         * 2.比较两个指针对应的数据
         *   比较相等：目标位不变，待移动位加1
         *   比较不等：目标位加1，待移动元素赋值到目标位；待移动位加1
         *
         * 细节问题
         *     题目要求返回数组新长度，即目标位对应的数据是最后一个元素，下标+1
         *     尝试移动元素前，若目标位与待移动位相同，跳过赋值操作
         * @param nums
         * @return
         */
        public int removeDuplicates(int[] nums) {
            // 处理边界问题
            if (nums.length == 0) return 0;
            // 1.定义两个指针（索引）分别指向目标位和待移动元素位
            int target = 0;
            for (int i = 1; i < nums.length; i++) { // i为待移动指针
                // 2.比较两个指针对应的数据
                if (nums[i] != nums[target]) {
                    // 不相等，则把目标位置后移
                    if (i != ++target) { //说明此时target后一定有重复元素
                        nums[target] = nums[i];
                    }
                }
            }
            return target+1;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
}